package org.convallaria.framework.common.constants.sys;

/**
 * 系统菜单相关常量
 * 
 * 功能特性：
 * - 定义菜单类型常量
 * - 定义菜单状态常量
 * - 定义菜单字段长度限制
 * - 提供统一的常量管理
 * 
 * 设计原则：
 * - 所有常量都是public static final
 * - 使用final类防止继承
 * - 私有构造函数防止实例化
 * - 按功能模块分组组织
 * 
 * @author convallaria
 * @since 1.0.0
 */
public final class MenuConstants {

    private MenuConstants() {
        // 防止实例化
    }

    // ==================== 菜单类型常量 ====================

    /**
     * 目录
     */
    public static final String MENU_TYPE_DIRECTORY = "M";

    /**
     * 菜单
     */
    public static final String MENU_TYPE_MENU = "C";

    /**
     * 按钮
     */
    public static final String MENU_TYPE_BUTTON = "F";

    // ==================== 菜单状态常量 ====================

    /**
     * 菜单正常状态
     */
    public static final String MENU_STATUS_NORMAL = "0";

    /**
     * 菜单停用状态
     */
    public static final String MENU_STATUS_DISABLED = "1";

    // ==================== 菜单显示状态常量 ====================

    /**
     * 菜单显示
     */
    public static final String MENU_VISIBLE_SHOW = "0";

    /**
     * 菜单隐藏
     */
    public static final String MENU_VISIBLE_HIDE = "1";

    // ==================== 外链标识常量 ====================

    /**
     * 是外链
     */
    public static final int IS_FRAME_YES = 0;

    /**
     * 不是外链
     */
    public static final int IS_FRAME_NO = 1;

    // ==================== 缓存标识常量 ====================

    /**
     * 缓存
     */
    public static final int IS_CACHE_YES = 0;

    /**
     * 不缓存
     */
    public static final int IS_CACHE_NO = 1;

    // ==================== 菜单字段长度限制 ====================

    /**
     * 菜单名称最大长度
     */
    public static final int MENU_NAME_MAX_LENGTH = 50;

    /**
     * 路由地址最大长度
     */
    public static final int PATH_MAX_LENGTH = 200;

    /**
     * 组件路径最大长度
     */
    public static final int COMPONENT_MAX_LENGTH = 255;

    /**
     * 路由参数最大长度
     */
    public static final int QUERY_MAX_LENGTH = 255;

    /**
     * 权限标识最大长度
     */
    public static final int PERMS_MAX_LENGTH = 100;

    /**
     * 菜单图标最大长度
     */
    public static final int ICON_MAX_LENGTH = 100;

    /**
     * 备注最大长度
     */
    public static final int REMARK_MAX_LENGTH = 500;

    /**
     * 显示顺序最小值
     */
    public static final int ORDER_NUM_MIN = 0;

    /**
     * 显示顺序最大值
     */
    public static final int ORDER_NUM_MAX = 999;

    // ==================== 菜单类型描述 ====================

    /**
     * 菜单类型描述映射
     */
    public static final String[] MENU_TYPE_DESCRIPTIONS = {
        "目录", "菜单", "按钮"
    };

    /**
     * 菜单状态描述映射
     */
    public static final String[] MENU_STATUS_DESCRIPTIONS = {
        "正常", "停用"
    };

    /**
     * 菜单显示状态描述映射
     */
    public static final String[] MENU_VISIBLE_DESCRIPTIONS = {
        "显示", "隐藏"
    };

    /**
     * 外链标识描述映射
     */
    public static final String[] IS_FRAME_DESCRIPTIONS = {
        "是", "否"
    };

    /**
     * 缓存标识描述映射
     */
    public static final String[] IS_CACHE_DESCRIPTIONS = {
        "缓存", "不缓存"
    };

    // ==================== 默认值常量 ====================

    /**
     * 默认菜单状态
     */
    public static final String DEFAULT_MENU_STATUS = MENU_STATUS_NORMAL;

    /**
     * 默认菜单显示状态
     */
    public static final String DEFAULT_MENU_VISIBLE = MENU_VISIBLE_SHOW;

    /**
     * 默认父菜单ID（根菜单）
     */
    public static final Long DEFAULT_PARENT_ID = 0L;

    /**
     * 默认显示顺序
     */
    public static final int DEFAULT_ORDER_NUM = 0;

    /**
     * 默认外链标识
     */
    public static final int DEFAULT_IS_FRAME = IS_FRAME_NO;

    /**
     * 默认缓存标识
     */
    public static final int DEFAULT_IS_CACHE = IS_CACHE_NO;

    /**
     * 默认菜单图标
     */
    public static final String DEFAULT_ICON = "#";

    // ==================== 业务规则常量 ====================

    /**
     * 菜单名称正则表达式（中文、字母、数字、下划线、连字符、空格、括号）
     */
    public static final String MENU_NAME_PATTERN = "^[\\u4e00-\\u9fa5a-zA-Z0-9_\\-\\s()（）]+$";

    /**
     * 路由地址正则表达式（字母、数字、下划线、连字符、斜杠、冒号、问号、等号、&）
     */
    public static final String PATH_PATTERN = "^[a-zA-Z0-9_\\-/:?=&]+$";

    /**
     * 组件路径正则表达式（字母、数字、下划线、连字符、斜杠、点号）
     */
    public static final String COMPONENT_PATTERN = "^[a-zA-Z0-9_\\-/.]+$";

    /**
     * 权限标识正则表达式（字母、数字、下划线、连字符、冒号）
     */
    public static final String PERMS_PATTERN = "^[a-zA-Z0-9_\\-:]+$";

    /**
     * 菜单树最大深度
     */
    public static final int MAX_MENU_DEPTH = 10;

    /**
     * 菜单名称分隔符
     */
    public static final String MENU_NAME_SEPARATOR = "/";

    // ==================== 常用菜单图标常量 ====================

    /**
     * 默认图标
     */
    public static final String ICON_DEFAULT = "#";

    /**
     * 系统管理图标
     */
    public static final String ICON_SYSTEM = "system";

    /**
     * 用户管理图标
     */
    public static final String ICON_USER = "user";

    /**
     * 角色管理图标
     */
    public static final String ICON_ROLE = "peoples";

    /**
     * 菜单管理图标
     */
    public static final String ICON_MENU = "tree-table";

    /**
     * 部门管理图标
     */
    public static final String ICON_DEPT = "tree";

    /**
     * 岗位管理图标
     */
    public static final String ICON_POST = "post";

    /**
     * 字典管理图标
     */
    public static final String ICON_DICT = "dict";

    /**
     * 参数设置图标
     */
    public static final String ICON_CONFIG = "edit";

    /**
     * 日志管理图标
     */
    public static final String ICON_LOG = "log";

    /**
     * 监控管理图标
     */
    public static final String ICON_MONITOR = "monitor";

    // ==================== 工具方法 ====================

    /**
     * 获取菜单类型描述
     * 
     * @param menuType 菜单类型
     * @return 菜单类型描述
     */
    public static String getMenuTypeDesc(String menuType) {
        if (MENU_TYPE_DIRECTORY.equals(menuType)) {
            return MENU_TYPE_DESCRIPTIONS[0];
        } else if (MENU_TYPE_MENU.equals(menuType)) {
            return MENU_TYPE_DESCRIPTIONS[1];
        } else if (MENU_TYPE_BUTTON.equals(menuType)) {
            return MENU_TYPE_DESCRIPTIONS[2];
        }
        return "未知";
    }

    /**
     * 获取菜单状态描述
     * 
     * @param status 状态值
     * @return 状态描述
     */
    public static String getMenuStatusDesc(String status) {
        if (MENU_STATUS_NORMAL.equals(status)) {
            return MENU_STATUS_DESCRIPTIONS[0];
        } else if (MENU_STATUS_DISABLED.equals(status)) {
            return MENU_STATUS_DESCRIPTIONS[1];
        }
        return "未知";
    }

    /**
     * 获取菜单显示状态描述
     * 
     * @param visible 显示状态值
     * @return 显示状态描述
     */
    public static String getMenuVisibleDesc(String visible) {
        if (MENU_VISIBLE_SHOW.equals(visible)) {
            return MENU_VISIBLE_DESCRIPTIONS[0];
        } else if (MENU_VISIBLE_HIDE.equals(visible)) {
            return MENU_VISIBLE_DESCRIPTIONS[1];
        }
        return "未知";
    }

    /**
     * 获取外链标识描述
     * 
     * @param isFrame 外链标识值
     * @return 外链标识描述
     */
    public static String getIsFrameDesc(Integer isFrame) {
        if (isFrame == null) {
            return "未知";
        }
        if (isFrame == IS_FRAME_YES) {
            return IS_FRAME_DESCRIPTIONS[0];
        } else if (isFrame == IS_FRAME_NO) {
            return IS_FRAME_DESCRIPTIONS[1];
        }
        return "未知";
    }

    /**
     * 获取缓存标识描述
     * 
     * @param isCache 缓存标识值
     * @return 缓存标识描述
     */
    public static String getIsCacheDesc(Integer isCache) {
        if (isCache == null) {
            return "未知";
        }
        if (isCache == IS_CACHE_YES) {
            return IS_CACHE_DESCRIPTIONS[0];
        } else if (isCache == IS_CACHE_NO) {
            return IS_CACHE_DESCRIPTIONS[1];
        }
        return "未知";
    }

    /**
     * 验证菜单类型是否有效
     * 
     * @param menuType 菜单类型
     * @return true=有效，false=无效
     */
    public static boolean isValidMenuType(String menuType) {
        return MENU_TYPE_DIRECTORY.equals(menuType) 
            || MENU_TYPE_MENU.equals(menuType) 
            || MENU_TYPE_BUTTON.equals(menuType);
    }

    /**
     * 验证菜单状态是否有效
     * 
     * @param status 状态值
     * @return true=有效，false=无效
     */
    public static boolean isValidMenuStatus(String status) {
        return MENU_STATUS_NORMAL.equals(status) || MENU_STATUS_DISABLED.equals(status);
    }

    /**
     * 验证菜单显示状态是否有效
     * 
     * @param visible 显示状态值
     * @return true=有效，false=无效
     */
    public static boolean isValidMenuVisible(String visible) {
        return MENU_VISIBLE_SHOW.equals(visible) || MENU_VISIBLE_HIDE.equals(visible);
    }

    /**
     * 验证外链标识是否有效
     * 
     * @param isFrame 外链标识值
     * @return true=有效，false=无效
     */
    public static boolean isValidIsFrame(Integer isFrame) {
        return isFrame != null && (isFrame == IS_FRAME_YES || isFrame == IS_FRAME_NO);
    }

    /**
     * 验证缓存标识是否有效
     * 
     * @param isCache 缓存标识值
     * @return true=有效，false=无效
     */
    public static boolean isValidIsCache(Integer isCache) {
        return isCache != null && (isCache == IS_CACHE_YES || isCache == IS_CACHE_NO);
    }

    /**
     * 验证菜单名称是否有效
     * 
     * @param menuName 菜单名称
     * @return true=有效，false=无效
     */
    public static boolean isValidMenuName(String menuName) {
        if (menuName == null || menuName.trim().isEmpty()) {
            return false;
        }
        if (menuName.length() > MENU_NAME_MAX_LENGTH) {
            return false;
        }
        return menuName.matches(MENU_NAME_PATTERN);
    }

    /**
     * 验证路由地址是否有效
     * 
     * @param path 路由地址
     * @return true=有效，false=无效
     */
    public static boolean isValidPath(String path) {
        if (path == null || path.trim().isEmpty()) {
            return true; // 路由地址可以为空
        }
        if (path.length() > PATH_MAX_LENGTH) {
            return false;
        }
        return path.matches(PATH_PATTERN);
    }

    /**
     * 验证组件路径是否有效
     * 
     * @param component 组件路径
     * @return true=有效，false=无效
     */
    public static boolean isValidComponent(String component) {
        if (component == null || component.trim().isEmpty()) {
            return true; // 组件路径可以为空
        }
        if (component.length() > COMPONENT_MAX_LENGTH) {
            return false;
        }
        return component.matches(COMPONENT_PATTERN);
    }

    /**
     * 验证权限标识是否有效
     * 
     * @param perms 权限标识
     * @return true=有效，false=无效
     */
    public static boolean isValidPerms(String perms) {
        if (perms == null || perms.trim().isEmpty()) {
            return true; // 权限标识可以为空
        }
        if (perms.length() > PERMS_MAX_LENGTH) {
            return false;
        }
        return perms.matches(PERMS_PATTERN);
    }

    /**
     * 验证显示顺序是否有效
     * 
     * @param orderNum 显示顺序
     * @return true=有效，false=无效
     */
    public static boolean isValidOrderNum(Integer orderNum) {
        if (orderNum == null) {
            return false;
        }
        return orderNum >= ORDER_NUM_MIN && orderNum <= ORDER_NUM_MAX;
    }

    /**
     * 判断是否为目录
     * 
     * @param menuType 菜单类型
     * @return true=目录，false=其他
     */
    public static boolean isDirectory(String menuType) {
        return MENU_TYPE_DIRECTORY.equals(menuType);
    }

    /**
     * 判断是否为菜单
     * 
     * @param menuType 菜单类型
     * @return true=菜单，false=其他
     */
    public static boolean isMenu(String menuType) {
        return MENU_TYPE_MENU.equals(menuType);
    }

    /**
     * 判断是否为按钮
     * 
     * @param menuType 菜单类型
     * @return true=按钮，false=其他
     */
    public static boolean isButton(String menuType) {
        return MENU_TYPE_BUTTON.equals(menuType);
    }

    /**
     * 判断是否为根菜单
     * 
     * @param parentId 父菜单ID
     * @return true=根菜单，false=子菜单
     */
    public static boolean isRootMenu(Long parentId) {
        return parentId == null || DEFAULT_PARENT_ID.equals(parentId);
    }

    /**
     * 判断是否为外链
     * 
     * @param isFrame 外链标识
     * @return true=外链，false=内链
     */
    public static boolean isFrame(Integer isFrame) {
        return isFrame != null && isFrame == IS_FRAME_YES;
    }

    /**
     * 判断是否缓存
     * 
     * @param isCache 缓存标识
     * @return true=缓存，false=不缓存
     */
    public static boolean isCache(Integer isCache) {
        return isCache != null && isCache == IS_CACHE_YES;
    }

    /**
     * 判断菜单是否显示
     * 
     * @param visible 显示状态
     * @return true=显示，false=隐藏
     */
    public static boolean isVisible(String visible) {
        return MENU_VISIBLE_SHOW.equals(visible);
    }

    /**
     * 清理菜单名称（去除多余空格）
     * 
     * @param menuName 原始菜单名称
     * @return 清理后的菜单名称
     */
    public static String cleanMenuName(String menuName) {
        if (menuName == null) {
            return "";
        }
        return menuName.trim().replaceAll("\\s+", " ");
    }

    /**
     * 清理路由地址（去除多余空格）
     * 
     * @param path 原始路由地址
     * @return 清理后的路由地址
     */
    public static String cleanPath(String path) {
        if (path == null) {
            return "";
        }
        return path.trim();
    }

    /**
     * 清理组件路径（去除多余空格）
     * 
     * @param component 原始组件路径
     * @return 清理后的组件路径
     */
    public static String cleanComponent(String component) {
        if (component == null) {
            return "";
        }
        return component.trim();
    }

    /**
     * 清理权限标识（去除多余空格）
     * 
     * @param perms 原始权限标识
     * @return 清理后的权限标识
     */
    public static String cleanPerms(String perms) {
        if (perms == null) {
            return "";
        }
        return perms.trim();
    }
}
